'use strict'

const chai = require('chai')
chai.use(require('chai-as-promised'))
const expect = require('chai').expect
const sinon = require('sinon')
const AwsInfo = require('../../../../../../lib/plugins/aws/info/index')
const AwsProvider = require('../../../../../../lib/plugins/aws/provider')
const Serverless = require('../../../../../../lib/serverless')

describe('#getResourceCount()', () => {
  let serverless
  let awsInfo
  let listStackResourcesStub

  beforeEach(() => {
    const options = {
      stage: 'dev',
      region: 'us-east-1',
    }
    serverless = new Serverless({ commands: [], options: {} })
    serverless.setProvider('aws', new AwsProvider(serverless, options))
    serverless.service.service = 'my-service'
    serverless.service.functions = {
      hello: {},
      world: {},
    }
    awsInfo = new AwsInfo(serverless, options)

    listStackResourcesStub = sinon.stub(awsInfo.provider, 'request')
  })

  afterEach(() => {
    awsInfo.provider.request.restore()
  })

  it('attach resourceCount to this.gatheredData after listStackResources call', async () => {
    const listStackResourcesResponse = {
      ResponseMetadata: { RequestId: '81386aed-258b-11e8-b3e8-a937105b7db3' },
      StackResourceSummaries: [
        {
          LogicalResourceId: 'ApiGatewayDeployment1520814106863',
          PhysicalResourceId: 'eoa2a2',
          ResourceType: 'AWS::ApiGateway::Deployment',
          LastUpdatedTimestamp: '2018-03-12T00:22:40.680Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId: 'ApiGatewayMethodHelloGet',
          PhysicalResourceId: 'hello-ApiGa-11R27BUE48W38',
          ResourceType: 'AWS::ApiGateway::Method',
          LastUpdatedTimestamp: '2018-03-12T00:22:37.478Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId: 'ApiGatewayResourceHello',
          PhysicalResourceId: 'az5f7l',
          ResourceType: 'AWS::ApiGateway::Resource',
          LastUpdatedTimestamp: '2018-03-12T00:22:22.916Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId: 'ApiGatewayRestApi',
          PhysicalResourceId: 'n1uk4p7kl0',
          ResourceType: 'AWS::ApiGateway::RestApi',
          LastUpdatedTimestamp: '2018-03-12T00:22:19.768Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId: 'HelloLambdaFunction',
          PhysicalResourceId: 'hello-world-2-dev-hello',
          ResourceType: 'AWS::Lambda::Function',
          LastUpdatedTimestamp: '2018-03-12T00:22:34.095Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId: 'HelloLambdaPermissionApiGateway',
          PhysicalResourceId:
            'hello-world-2-dev-HelloLambdaPermissionApiGateway-18KKZXJG1DPF5',
          ResourceType: 'AWS::Lambda::Permission',
          LastUpdatedTimestamp: '2018-03-12T00:22:46.950Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId:
            'HelloLambdaVersiongZDaMtQjEhvXacHdpTLnQ61zDCdI2IWVYCbuE50pj8',
          PhysicalResourceId:
            'arn:aws:lambda:us-east-1:111111111:function:hello-world-2-dev-hello:2',
          ResourceType: 'AWS::Lambda::Version',
          LastUpdatedTimestamp: '2018-03-12T00:22:37.256Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId: 'HelloLogGroup',
          PhysicalResourceId: '/aws/lambda/hello-world-2-dev-hello',
          ResourceType: 'AWS::Logs::LogGroup',
          LastUpdatedTimestamp: '2018-03-12T00:22:20.095Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId: 'IamRoleLambdaExecution',
          PhysicalResourceId: 'hello-world-2-dev-us-east-1-lambdaRole',
          ResourceType: 'AWS::IAM::Role',
          LastUpdatedTimestamp: '2018-03-12T00:22:30.995Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
        {
          LogicalResourceId: 'ServerlessDeploymentBucket',
          PhysicalResourceId:
            'hello-world-2-dev-serverlessdeploymentbucket-1e3l68m8zaz7i',
          ResourceType: 'AWS::S3::Bucket',
          LastUpdatedTimestamp: '2018-03-12T00:22:11.380Z',
          ResourceStatus: 'CREATE_COMPLETE',
        },
      ],
    }

    listStackResourcesStub.resolves(listStackResourcesResponse)

    awsInfo.gatheredData = {
      info: {
        functions: [],
        endpoints: [],
        service: '',
        stage: '',
        region: '',
        stack: '',
      },
      outputs: [],
    }

    return expect(awsInfo.getResourceCount()).to.be.fulfilled.then(() => {
      expect(listStackResourcesStub.calledOnce).to.equal(true)
      expect(
        listStackResourcesStub.calledWithExactly(
          'CloudFormation',
          'listStackResources',
          {
            StackName: awsInfo.provider.naming.getStackName(),
            NextToken: undefined,
          },
        ),
      ).to.equal(true)

      expect(awsInfo.gatheredData.info.resourceCount).to.equal(10)
    })
  })
})
